package com.jiashihui.schema_lgorithm.spring;

import com.jiashihui.schema_lgorithm.spring.bean.Student;
import com.jiashihui.schema_lgorithm.spring.bean.Teacher;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.core.io.ClassPathResource;

/**
 * @author jiashihui
 * @date 2019/03/22
 */
public class MyTest {

    public static void main(String[] args) {
        // 测试注解方式的依赖注入
        testAnnotationBean();
        // 测试Bean的不同加载方式
        //testGetBeanWay();
    }

    public static void testGetBeanWay() {
        //（1）ApplicationContext接口容器 加载的时候调用Student的无参构造方法
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring/spring-bean.xml");

        // （2） BeanFactory接口容器，只有在调用getBean("student")方法时才会调用Student的无参构造方法，在容器中创建Studnet的实例。
        BeanFactory bf= new XmlBeanFactory(new ClassPathResource("spring/spring-bean.xml"));
        bf.getBean("student");
    }

    public static void testAnnotationBean() {
        ApplicationContext ac = new ClassPathXmlApplicationContext("spring/spring-bean.xml");
        Student student = (Student)ac.getBean("student");
        System.out.println(student.getName());
        System.out.println(student.getAge());

        // 对于bean属性为java对象的依赖注入，分为两种一种是byName类型的，一种是byType类型的。
        // 而使用的注解分别是@Autowired和@Resource,对于byType类型的两者的使用没有区别，但是对于byName类型的@Autowired要使用联合注解@Qualifier,所以说使用@Resource较为简单。
        Teacher teacher = (Teacher)ac.getBean("teacher");
        System.out.println(teacher.getStudent().getName());
        System.out.println(teacher.getStudent().getAge());
    }

}
